﻿#ifndef DANODEGRAPHICSSCENE_H
#define DANODEGRAPHICSSCENE_H
#include <QtCore/qglobal.h>
#include "DAWorkFlowGlobal.h"
#include <QGraphicsScene>
#include "DAAbstractNodeGraphicsItem.h"
#include "DAAbstractNodeLinkGraphicsItem.h"
class QGraphicsSceneMouseEvent;
DA_IMPL_FORWARD_DECL(DANodeGraphicsScene)

class DAWORKFLOW_API DANodeGraphicsScene : public QGraphicsScene
{
    Q_OBJECT
    DA_IMPL(DANodeGraphicsScene)
    friend class DAAbstractNodeGraphicsItem;
    friend class DAAbstractNodeLinkGraphicsItem;

public:
    DANodeGraphicsScene(QObject *p = nullptr);
    DANodeGraphicsScene(const QRectF &sceneRect, QObject *p = nullptr);
    DANodeGraphicsScene(qreal x, qreal y, qreal width, qreal height, QObject *p = nullptr);
    ~DANodeGraphicsScene();
    // 判断是否处于开始连接状态
    bool isStartLink() const;

    // 获取当前鼠标在scene的位置
    QPointF getCurrentMouseScenePos() const;

    // 获取选中的NodeGraphicsItem,如果没有返回nullptr，如果选中多个，返回第一个
    DAAbstractNodeGraphicsItem *getSelectedNodeGraphicsItem() const;
    // 获取选中的NodeGraphicsItem,如果没有返回一个空list
    QList<DAAbstractNodeGraphicsItem *> getSelectedNodeGraphicsItems() const;
    // 获取选中的NodeLinkGraphicsItem,如果没有返回nullptr，如果选中多个，返回第一个
    DAAbstractNodeLinkGraphicsItem *getSelectedNodeLinkGraphicsItem() const;
    // 获取选中的NodeLinkGraphicsItem,如果没有返回一个空list
    QList<DAAbstractNodeLinkGraphicsItem *> getSelectedNodeLinkGraphicsItems() const;
signals:

    /**
     * @brief 节点的连接点被选中触发的信号
     * @param item 节点item
     * @param lp 连接点
     */
    void nodeItemLinkPointSelected(DAAbstractNodeGraphicsItem *item, const DANodeLinkPoint &lp, QGraphicsSceneMouseEvent *event);

    /**
     * @brief 说明link已经为空，这时会自动remove
     */
    void nodeLinkItemIsEmpty(DAAbstractNodeLinkGraphicsItem *link);

protected slots:
    //此函数为FCNodeGraphicsScene处理连接点点击事件
    void onNodeItemLinkPointSelected(DAAbstractNodeGraphicsItem *item, const DANodeLinkPoint &lp, QGraphicsSceneMouseEvent *event);

protected:
    //鼠标点击事件
    virtual void mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent);

    //鼠标移动事件
    virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent);

    //此函数将会触发 nodeItemLinkPointSelected 信号
    void callNodeItemLinkPointSelected(DAAbstractNodeGraphicsItem *item, const DANodeLinkPoint &lp, QGraphicsSceneMouseEvent *event);

    // itemlink都没用节点连接时会调用这个函数，发出
    void callNodeItemLinkIsEmpty(DAAbstractNodeLinkGraphicsItem *link);

private:
    void initConnect();
};

#endif // FCNODEGRAPHICSSCENE_H
